package cn.xhz.gdal.config;

import cn.hutool.core.io.FileUtil;
import cn.xhz.gdal.enums.GDALTypeEnum;
import cn.xhz.gdal.util.Assert;
import org.gdal.ogr.Driver;
import org.gdal.ogr.ogr;

import java.io.File;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 常见配置
 *
 * @author life-oss
 * @since 2022/12/15
 */
public class CommonConfig {
    /**
     * 文件路径
     */
    private String path;
    /**
     * 驱动选择
     * 默认选择shp驱动
     */
    private GDALTypeEnum gdalTypeEnum=GDALTypeEnum.SHAPE;
    /**
     * 是否初始化环境
     * 默认开启
     */
    private Boolean initContext=true;
    /**
     * 如果在这里添加了该对象，则代表将会失去cud功能
     */
    private List<GDALTypeEnum> ignoreGdalType= Collections.singletonList(GDALTypeEnum.GDB);

    //====================================多余提供方法 start===============================
    /**
     * 默认
     * 帮助调用者初始化环境
     */
    public void initContext(){
        if (initContext){
            ConfigUtil.initContext(this.gdalTypeEnum);
        }
    }

    /**
     * 获取驱动对象
     *
     * @return {@link Driver}
     */
    public Driver getDriver(){
        return ogr.GetDriverByName(getGdalTypeEnum().getType());
    }

    /**
     * 检查必填
     * @return 会报错
     */
    public void checkRequired(){
        Assert.isNotNull(this.path,"请传入必填项【path(路径)】!");
    }

    //====================================多余提供方法 stop===============================
    //====================================get和set方法 start=============================

    public String getPath() {
        return path;
    }
    /**
     * 提供绝对地址
     * @param file 文件对象
     */
    public void setPath(File file){
        this.path=file.getAbsolutePath();
    }

    /**
     * 修改默认方法
     * 详细方法可参考hutool官网
     * @see FileUtil#file(String)
     * @param path 相对ClassPath的目录或者绝对路径目录
     */
    public void setPath(String path) {
        this.path = FileUtil.file(path).getAbsolutePath();
    }

    public GDALTypeEnum getGdalTypeEnum() {
        return gdalTypeEnum;
    }

    public void setGdalTypeEnum(GDALTypeEnum gdalTypeEnum) {
        this.gdalTypeEnum = gdalTypeEnum;
    }

    public Boolean getInitContext() {
        return initContext;
    }

    public void setInitContext(Boolean initContext) {
        this.initContext = initContext;
    }

    public List<GDALTypeEnum> getIgnoreGdalType() {
        return ignoreGdalType;
    }

    public void setIgnoreGdalType(List<GDALTypeEnum> ignoreGdalType) {
        this.ignoreGdalType.addAll(ignoreGdalType);
    }
    public void addIgnoreGdalType(GDALTypeEnum... ignoreGdalType) {
        this.ignoreGdalType.addAll(Arrays.asList(ignoreGdalType));
    }
    //====================================get和set方法 stop=============================
}
